JclDebug - CallStack
Otázka od: mstevlik@gamo.sk
6. 9. 2004 13:42
Hi all,
Potreboval by som pomoct s JclDebug
Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco ju
hodi a kde
Debatovalo sa tu o JclDebug, takze by som rad vyuzil to
Urobil som si skusobnu aplikaciu kde v fcii Delenie naschval delim nulou
Tuto fciu volam na click tlacitka
A teraz by som potreboval urobit nieco take, aby mi to do suboru ulozilo,
kde nastala chyba (Unit, Riadok, pripadne CallStack) a preco chyba nastala
(chybova hlaska)
Je mozne toto cez Jcldebug dosiahnut a ak ano, tak co kde treba nastavit
Dakujem
Stevlik Marian
ISYS programator
GAMO a.s.
Kyjevske nam. 6
974 04 Banska Bystrica
mail: mstevlik@gamo.sk
tel: +421 48 4137935, 4372111
ip-tel: 421 48 4372098
mobil: +412 905 462010
ICQ: 38493645
Odpovedá: Petr Fejfar
6. 9. 2004 13:57
mstevlik@gamo.sk wrote:
> A teraz by som potreboval urobit nieco take, aby mi to do suboru
> ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a preco
> chyba nastala (chybova hlaska)
> Je mozne toto cez Jcldebug dosiahnut a ak ano, tak co kde treba
> nastavit Dakujem
Tohle pouzivame u systemu, ktere trvale loguji svoji aktivitu do trace logu
a stack si v pripade exception dumpuji z duvodu citelnosti do samostatneho
souboru, kde v trace logu bude jen odkaz na exception:
procedure TraceStack(const AID:ANSIString);
{$IfDef vcvTracing}
var
Info: TStringList;
Idx: integer;
begin
try
Info := TStringList.Create;
try
JclLastExceptStackList.AddToStrings(Info,FALSE,FALSE,FALSE);
with GetLocationInfo(Caller(1)) do
StackLog.LogFmt(eglfiERR,UnitName,ExtractMethodName(ProcedureName),'--------
-- Stack dump for exception [%s]',[AID]);
for Idx:=0 to Info.Count-1 do
StackLog.Log(eglfiERR,sz,sz,Info[Idx]);
StackLog.Log(eglfiERR,sz,sz,'---------- Bottom of the except
stack');
finally
Info.Free;
end;
except
end;
end;
{$else}
begin
end;
{$endif}
procedure HandleException(ExceptObj:TObject; ExceptAddr:Pointer;
AnyExceptOSException:Boolean);
var
ID: ANSIString;
LastError: dword;
begin
LastError := GetLastError;
try
try
inc(ExcCount);
if Assigned(TrLog) and (JclLastExceptStackList<>nil) then
begin
ID := '#'+IntToStr(ExcCount);
TrLog.LogFmt(eglfiERR,'############',Format('>> STACK DUMP
%s',[ID]),'EXCEPTION %s:
%s',[Exception(ExceptObj).ClassName,Exception(ExceptObj).Message]);
TraceStack(ID);
end;
except
end;
finally
SetLastError(LastError);
end;
end;
procedure __StartExceptionTracking;
begin
{$IfDef vcvTracing}
JclAddExceptNotifier(HandleException);
JclStackTrackingOptions := [stStack,stRawMode,stStaticModuleList];
JclStartExceptionTracking;
{$endif}
end;
procedure __StopExceptionTracking;
begin
{$IfDef vcvTracing}
JclStopExceptionTracking;
JclRemoveExceptNotifier(HandleException);
{$endif}
end;
Odpovedá: Petr Brant
6. 9. 2004 14:04
Lze a velmi jednoduse: Podivej se na ExceptDlg v prikladech k JCL, tam uz je
to hotove (ten unit musis dat do DPR na uplne prvni misto do Uses), musis
zmenit parametry linkeru, aby vytvoril MAP soubor a hotovo. Ten ExceptDlg si
uprav tak, aby se vse ukladalo do souboru, to uz je jednoduche.
Zdravim
RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz
Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco ju hodi
a kde Debatovalo sa tu o JclDebug, takze by som rad vyuzil to Urobil som si
skusobnu aplikaciu kde v fcii Delenie naschval delim nulou Tuto fciu volam
na click tlacitka A teraz by som potreboval urobit nieco take, aby mi to do
suboru ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a preco
chyba nastala (chybova hlaska) Je mozne toto cez Jcldebug dosiahnut a ak
ano, tak co kde treba nastavit Dakujem
Odpovedá: mstevlik@gamo.sk
6. 9. 2004 14:29
To som pozeral, ale nikde som neprisiel na to, ako tam zobrazim nazov
Unitu, Procedury, riadku
A co presne treba nastavit do Linkeru?
Stevlik Marian
ISYS programator
GAMO a.s.
Kyjevske nam. 6
974 04 Banska Bystrica
mail: mstevlik@gamo.sk
tel: +421 48 4137935, 4372111
ip-tel: 421 48 4372098
mobil: +412 905 462010
ICQ: 38493645
delphi-l-owner@clexpert.cz wrote on 06.09.2004 14:50:04:
> Lze a velmi jednoduse: Podivej se na ExceptDlg v prikladech k JCL, tam
uz je
> to hotove (ten unit musis dat do DPR na uplne prvni misto do Uses),
musis
> zmenit parametry linkeru, aby vytvoril MAP soubor a hotovo. Ten
ExceptDlg si
> uprav tak, aby se vse ukladalo do souboru, to uz je jednoduche.
>
> Zdravim
>
> RNDr. Petr Brant [brant@dcomm.cz]
> http://brant.wz.cz
>
>
> Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco ju
hodi
> a kde Debatovalo sa tu o JclDebug, takze by som rad vyuzil to Urobil som
si
> skusobnu aplikaciu kde v fcii Delenie naschval delim nulou Tuto fciu
volam
> na click tlacitka A teraz by som potreboval urobit nieco take, aby mi to
do
> suboru ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a
preco
> chyba nastala (chybova hlaska) Je mozne toto cez Jcldebug dosiahnut a ak
> ano, tak co kde treba nastavit Dakujem
Odpovedá: Petr Brant
6. 9. 2004 14:55
Takze ukazka DPR:
program Project1;
uses
exceptdlg, <----------- musi byt na prvnim miste
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
V Unit1 zpusobim chybu:
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
s[1]:= 'a';
end;
Upravim parametry linkeru (Project/Options/Linker a u Map file zaskrtni
Detailed).
Spustim program, zmacknu cudlik a vybehne mi toto (zkraceno) :
Exception class: EAccessViolation
Exception address: 00453C73
----------------------------------------------------------------------------
------------------------
Stack list, generated 6.9.2004 15:42:01
[00453C73] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $8
[004031C5] System.@HandleAnyException + $35
[00453C73] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $8
[00420660] StdCtrls.TButton.CNCommand + $0
[00453C73] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $8
[00453C8C] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $21
[0043B260] Controls.TControl.Click + $68
....
....
[7CDF0000] C:\WINDOWS\system32\OLE32.DLL
5.1.2600.1362 - 5.1.2600.1362 (xpsp2.040109-1800)
Microsoft OLE for Windows
[7E190000] C:\WINDOWS\system32\GDI32.dll
5.1.2600.1346 - 5.1.2600.1346 (xpsp2.040109-1800)
GDI Client DLL
----------------------------------------------------------------------------
------------------------
Active Controls hiearchy:
TButton "Button1"
TForm1 "Form1"
----------------------------------------------------------------------------
------------------------
Kdybys neco nevedel, napis na ICQ, cislo 68652380.
RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz
To som pozeral, ale nikde som neprisiel na to, ako tam zobrazim nazov Unitu,
Procedury, riadku A co presne treba nastavit do Linkeru?
> Lze a velmi jednoduse: Podivej se na ExceptDlg v prikladech k JCL, tam
uz je
> to hotove (ten unit musis dat do DPR na uplne prvni misto do Uses),
musis
> zmenit parametry linkeru, aby vytvoril MAP soubor a hotovo. Ten
ExceptDlg si
> uprav tak, aby se vse ukladalo do souboru, to uz je jednoduche.
>
> Zdravim
>
> RNDr. Petr Brant [brant@dcomm.cz]
> http://brant.wz.cz
>
>
> Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco
> ju
hodi
> a kde Debatovalo sa tu o JclDebug, takze by som rad vyuzil to Urobil
> som
si
> skusobnu aplikaciu kde v fcii Delenie naschval delim nulou Tuto fciu
volam
> na click tlacitka A teraz by som potreboval urobit nieco take, aby mi
> to
do
> suboru ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a
preco
> chyba nastala (chybova hlaska) Je mozne toto cez Jcldebug dosiahnut a
> ak ano, tak co kde treba nastavit Dakujem
Odpovedá: Jiri Cincura
6. 9. 2004 15:22
Petr Brant wrote:
> Takze ukazka DPR:
>
> program Project1;
>
> uses
> exceptdlg, <----------- musi byt na prvnim miste
> Forms,
> Unit1 in 'Unit1.pas' {Form1};
>
Ja ho na prvnim miste nemam a funguje take skvele.
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net
Odpovedá: Petr Brant
6. 9. 2004 16:07
Duvod je ten, ze v nekterych unitech PRED ExceptDlg muze pri jejich
natahovani (initialization) dojit k chybe a ta pak nebude korektne
obslouzena.
RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz
> Takze ukazka DPR:
>
> program Project1;
>
> uses
> exceptdlg, <----------- musi byt na prvnim miste
> Forms,
> Unit1 in 'Unit1.pas' {Form1};
>
Ja ho na prvnim miste nemam a funguje take skvele.